如何用Android Studio 优雅的开发System App |
您所在的位置:网站首页 › android 修改系统设置 › 如何用Android Studio 优雅的开发System App |
毕业来到手机公司做Android,发现公司的很多同事还在使用Eclipse 进行开发Android System App 现在已经21世纪啦,大清都完了啊!Android Studio你不用?那么我现在就教你如何优雅的使用Android Studio构建系统应用程序! 首先,开发系统应用程序离不开访问framework的私有方法和接口,一般你在IDE中看到的是这样: 这红色不能忍啊 /** * @hide like {@link #startService(Intent)} but for a specific user. */ @Nullable @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public abstract ComponentName startServiceAsUser(Intent service, UserHandle user);这个隐藏API其实就在framework.jar中,Context中就有,只不过"hide"你并不能访问。 这些方法其实很多,比如很多厂商自己定义的方法,这个时候你只能盲打函数。 下面这些操作,就是让你可以在gradle中编译你的系统应用。 找到未压缩的framework.jar 文件 路径为 /android/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar. 请注意,并不是/android/out/target/product/your_target/system/framework/framework.jar.第一个是 java库,第二个是编译完成的二进次文件,显然我们需要的是第一个。 然后把.jar文件放入你工程的lib中,在gradle的dependencies中使用provided进行引用。 这个时候你就可以访问厂商定义的一些私有的类了 但这时候你并不能访问那些隐藏的方法! 因为这个时候你IDE中链接到的还只是本地SDK中的android.jar,并不是你需要的framework.jar。 所以你可能sync的时候没有问题,一旦build立马boom。 因此,我们在Android SDK放置框架之前部署我们需要的framework.jar。 这个时候我们需要为Android Gradle插件添加一个钩子,-Xbooclasspath / p:在 bootstarp classpath 之前添加classpath,像下面这样: allprojects { repositories { jcenter() google() } gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs.add('-Xbootclasspath/p:systemjar/framework.jar') } } }最后,你如果需要在Android Studio里运行,还需要在app/app.iml中,把jdk的顺序调整到最后。 如果让gradle自动排序到最后,可以参考以下的task,运行task之后帮你修改sdk的order task pushDownJdkDependency { def imlFile = file("OPSafe.iml") println 'Change OPSafe.iml order' try { def parsedXml = (new XmlParser()).parse(imlFile) def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' } parsedXml.component[1].remove(jdkNode) new Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': "Android API 26 Platform", 'jdkType': 'Android SDK']) def writer = new StringWriter() new XmlNodePrinter(new PrintWriter(writer)).print(parsedXml) imlFile.text = writer.toString() } catch (FileNotFoundException e) { // nop, iml not found } }结束,请发给我一朵小红花!!! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |